package com.zhike.service.group;

import java.util.ArrayList;
import java.util.List;

import com.zhike.common.dto.GroupDeleteMemberDTO;
import com.zhike.common.dto.GroupDissDTO;
import com.zhike.common.dto.GroupInviteJoinDTO;
import com.zhike.common.dto.GroupMember4Cache;
import com.zhike.common.dto.GroupMemberEntity;
import com.zhike.common.dto.GroupMemberProhibitDTO;
import com.zhike.common.dto.GroupNoticeDTO;
import com.zhike.common.dto.GroupProhibitDTO;
import com.zhike.common.dto.GroupReqDTO;
import com.zhike.common.dto.GroupSetAdminDTO;
import com.zhike.common.dto.GroupTransDTO;
import com.zhike.common.dto.GroupUpdateNameDTO;
import com.zhike.common.dto.GroupIdDTO;
import com.zhike.common.dto.GroupUserNicknameDTO;
import com.zhike.common.dto.GroupVerficateDTO;
import com.zhike.common.model.GroupBase;
import com.zhike.common.model.GroupReq;
import com.zhike.common.vo.GroupIdUserIdVO;
import com.zhike.common.vo.GroupMemberCountVO;
import com.zhike.common.vo.UserAvatarVO;
import com.zhike.common.vo.UserInfo4Cache;

public interface IGroupService {

  /**
   * 查询所有群组的群员数据
   * 
   * @return
   */
  List<GroupIdUserIdVO> queryGroupsAllData();

  /**
   * 查询指定用户的所有群列表。
   * 
   * @param uId
   * @return
   */
  List<GroupBase> queryGroupInfoList(String uId);

  /**
   * 查询群的基本信息
   * 
   * @param gid
   * @param myUserId
   * @return
   */
  GroupBase queryGroupInfo(String gid, String myUserId);

  /**
   * 查询群成员列表接口
   *
   * @param dfc 统一对象
   * @param ip  ip
   * @return 结果
   */
  List<GroupMemberEntity> queryGroupPersonList(String uid, GroupIdDTO dto);

  /**
   * 创建群
   * 
   * @param gme     群主
   * @param members 群成员（除了群主）
   */
  Boolean createGroup(GroupMemberEntity gme, ArrayList<GroupMemberEntity> members);

  /**
   * 拼合群头像时，使用的群员头像数
   *
   * @param groupId groupId
   * @return 结果
   */
  GroupMemberCountVO queryGroupMemberCount(String groupId);

  /**
   * 查询该群中9个用户的头像文件名
   *
   * @param groupId groupId
   * @return 结果
   */
  List<UserAvatarVO> queryGroupUserHeadOrderNine(String groupId);

  /**
   * 更新数据中本次拼合头像的人数
   *
   * @param size    数量
   * @param groupId groupId
   */
  Boolean updateGroupAvatarIncludeCnt(Integer size, String groupId);

  public Integer queryGroupRequestCountByUidFriendUid(String gId, String friendUserUid);

  /**
   * 新增邀请去群请求
   *
   * @param uid       uid
   * @param friendUid friendUid
   * @param desc      desc
   * @param ip        ip
   * @param time      time
   * @param gId       gId
   * @return 结果
   */
  Boolean insertGroupRequestData(String uid, String friendUid, String desc, String ip, Long time, String gId);

  /**
   * 修改入群请求时间
   *
   * @param desc      desc
   * @param time      time
   * @param uid       uid
   * @param friendUid friendUid
   * @param gId       gId
   * @return 结果
   */
  Boolean updateGroupRequestTime(String desc, Long time, String uid, String friendUid, String gId);

  /**
   * 修改群名称接口
   *
   * @param dfc 统一对象
   * @return 结果
   */
  Boolean updateGroupName(GroupUpdateNameDTO dto);

  /**
   * 修改"我"的群昵称接口
   *
   * @param dfc 统一对象
   * @return 结果
   */
  Boolean updateGroupUserNickName(String uid, GroupUserNicknameDTO dto);

  /**
   * 群邀请验证
   * 
   * @param uid
   * @param dto
   * @return
   */
  Boolean updateGroupVerficate(String uid, GroupVerficateDTO dto);

  /**
   * 群全员禁言设置
   * 
   * @param uid
   * @param dto
   * @return
   */
  Boolean setAllProhibitMsg(String uid, String nickname, GroupProhibitDTO dto);

  /**
   * 群成员禁言
   * 
   * @param uid
   * @param nickname
   * @param dto
   * @return
   */
  Boolean prohibitMembers(String uid, String nickname, GroupMemberProhibitDTO dto);

  /**
   * 修改群公告接口
   *
   * @param dfc 统一对象
   * @return 结果
   */
  Boolean updateGroupNotice(String uid, GroupNoticeDTO dto);

  /**
   * 删除群成员
   *
   * @param dto 统一对象
   * @return 结果
   */
  Boolean deleteGroupPerson(UserInfo4Cache uc, GroupDeleteMemberDTO dto);

  /**
   * 用户主动退群
   * 
   * @param uid
   * @param dto
   * @return
   */
  Boolean exitGroup(UserInfo4Cache uc, GroupIdDTO dto);

  /**
   * 邀请入群
   * 
   * @param dto
   * @return
   */
  Boolean inviteToJoinTheGroup(String uid, String nickname, GroupInviteJoinDTO dto);

  /**
   * 邀请入群审核列表
   * 
   * @param uid
   * @param groupId
   * @return
   */
  List<GroupReq> inviteToGroupReqList(String uid, String groupId);

  /**
   * 转让本群接口（群主可用）
   *
   * @param dfc 统一对象
   * @return 结果
   */
  Boolean transferenceGroup(String uid, String nickname, GroupTransDTO dto);

  /**
   * 解散群接口
   *
   * @param dfc 统一对象
   * @param ip  ip
   * @return 结果
   */
  Boolean dissolutionGroup(String uid, String nickname, GroupDissDTO dto);

  /**
   * 设置群管理员
   * 
   * @return
   */
  Boolean setAdministrator(String uid, String nickname, GroupSetAdminDTO dto);

  /**
   * 是否是群主
   * 
   * @return
   */
  Boolean isGroupOwner(String groupId, String userId);

  /**
   * 是否群管理
   * 
   * @param groupId
   * @param uid
   * @return
   */
  Boolean isGroupAdmin(String groupId, String uid);

  /**
   * 同意入群
   * 
   * @return
   */
  Boolean agree(String uid, String nickname, GroupReqDTO dto);

  /**
   * 拒绝入群
   * 
   * @return
   */
  Boolean refuse(String uid, String nickname, GroupReqDTO dto);

  /**
   * 获取群管理员列表（包含群主）
   * 
   * @param groupId
   * @return
   */
  List<GroupMember4Cache> getAdminUsers(String groupId);

  List<String> getAdminUsersIds(String groupId);
}
